# Python 数据结构之字典（Dictionary）
# 字典是另一种可变容器模型，且可存储任意类型对象。字典用键-值（key-value）存储，键必须是唯一的，值可以取任何数据类型。

# 创建字典
# 字典是通过花括号{}创建的，键值对之间用冒号:分隔，键和值用逗号隔开。
# 键必须是唯一的，重复的键会覆盖之前的值。


# 字典内置函数
# len()：返回字典的长度。
# str()：返回字典的字符串表示。
# type()：返回字典的类型。
# dict()：将其他映射或序列转换为字典。


# 字典方法
# clear()：清空字典。
# copy()：返回一个字典的浅复制。
# fromkeys()：创建一个新字典，以序列seq中的元素作为字典的键，val作为字典的值。
# get()：返回指定键的值，如果键不存在，返回default值。
# items()：以列表返回可遍历的(键, 值)元组数组。
# keys()：以列表返回字典所有的键。
# pop()：删除字典给定键的值，返回值为被删除的值。
# popitem()：随机删除并返回字典中的一对键和值。
# setdefault()：返回指定键的值，如果不存在，则将其添加到字典中并返回default值。
# update()：更新字典，将序列seq中的元素作为字典的键，val作为字典的值。
# values()：以列表返回字典所有的值。



# 示例：
# 创建一个空字典
my_dict = {}
empty_dict = dict()     # 使用内置函数创建空字典，等价于 {}
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("字典1：", dict1)


# 访问字典元素
# 访问字典元素可以用方括号[]，传入键即可。
# 如果键不存在，会报错KeyError。
# 示例：
print("字典1['name']:", dict1['name'])
print("字典1['age']:", dict1['age'])
print("字典1['city']:", dict1['city'])


# 字典添加元素
# 字典添加元素可以用方括号[]，传入键和值即可。
# 如果键不存在，会自动添加；如果键存在，会覆盖之前的值。
# 示例：
dict1['gender'] = '男'
dict1['age'] = 26
print("添加后字典：", dict1)


# 修改字典元素
# 字典修改元素可以用方括号[]，传入键和值即可。
# 如果键不存在，会报错KeyError。
# 示例：
dict1['age'] = 27
print("修改后字典：", dict1)


# 删除字典元素
# 字典删除元素可以用del语句，传入键即可。
# 如果键不存在，会报错KeyError。
# 示例：
del dict1['city']
print("删除后字典：", dict1)
#del dict1
# print("删除后字典：", dict1)   # 输出：NameError: name 'dict1' is not defined


# 字典长度
# 字典的长度用len()函数获取。
# 示例：
print("字典长度：", len(dict1))


# 字典遍历
# 字典遍历可以用for循环，遍历字典的所有键值对。
# 示例：
for key, value in dict1.items():
    print(key, ":", value)


# 清空字典
# 字典清空可以用clear()函数。
# 示例：
dict1.clear()
print("清空后字典：", dict1)


# 字典复制
# 字典复制可以用copy()函数。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
dict2 = dict1.copy()
print("复制后字典：", dict2)


# 字典合并
# 字典合并可以用update()函数。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
dict2 = {'gender': '男', 'age': 26, 'city': '深圳'}
dict1.update(dict2)
print("合并后字典：", dict1)


# 字典键值对排序
# 字典键值对排序可以用sorted()函数。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
sorted_dict = dict(sorted(dict1.items()))
print("排序后字典：", sorted_dict)


# 字典键值对反转
# 字典键值对反转可以用dict()函数。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
reversed_dict = dict(reversed(dict1.items()))
print("反转后字典：", reversed_dict)


# fromKeys()方法
# fromKeys()方法可以创建一个新字典，以序列seq中的元素作为字典的键，val作为字典的值。
# 示例：
keys = ['name', 'age', 'city']
dict1 = dict.fromkeys(keys, "default value")
print("fromKeys()方法创建字典：", dict1)


# get()方法
# get()方法可以返回指定键的值，如果键不存在，返回default值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("get()方法获取值：", dict1.get('name'))
print("get()方法获取不存在的值：", dict1.get('gender', '未知'))


# items()方法
# items()方法可以以列表返回可遍历的(键, 值)元组数组。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("items()方法获取键值对：", dict1.items())


# keys()方法
# keys()方法可以以列表返回字典所有的键。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("keys()方法获取键：", dict1.keys())


# pop()方法
# pop()方法可以删除字典给定键的值，返回值为被删除的值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("pop()方法删除键值对：", dict1.pop('name'))
print("pop()方法删除后字典：", dict1)


# popitem()方法
# popitem()方法随机删除并返回字典中的一对键和值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("popitem()方法随机删除键值对：", dict1.popitem())
print("popitem()方法删除后字典：", dict1)


# setdefault()方法
# setdefault()方法可以返回指定键的值，如果不存在，则将其添加到字典中并返回default值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("setdefault()方法获取值：", dict1.setdefault('name'))
print("setdefault()方法获取不存在的值：", dict1.setdefault('gender', '未知'))
print("setdefault()方法添加后字典：", dict1)


# update()方法
# update()方法可以更新字典，将序列seq中的元素作为字典的键，val作为字典的值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
dict2 = {'gender': '男', 'age': 26, 'city': '深圳'}
dict1.update(dict2)
print("update()方法合并字典：", dict1)


# values()方法
# values()方法可以以列表返回字典所有的值。
# 示例：
dict1 = {'name': '风清影竹', 'age': 25, 'city': '广州'}
print("values()方法获取值：", dict1.values())